import java.util.Scanner;

/**
 * 题目2：课程答疑程序
 * 使用队列实现多个同学问题的排队解答
 */
public class QASystem {
    private QueueInterface<Question> questionQueue; // 问题队列
    private int questionCounter; // 问题编号计数器

    /**
     * 构造方法
     */
    public QASystem() {
        this.questionQueue = new ArrayQueue<>();
        this.questionCounter = 0;
    }

    /**
     * 学生提交问题
     * 
     * @param studentName     学生姓名
     * @param studentId       学号
     * @param questionContent 问题内容
     */
    public void submitQuestion(String studentName, String studentId, String questionContent) {
        questionCounter++;
        Question question = new Question(studentName, studentId, questionContent, questionCounter);
        questionQueue.enqueue(question);
        System.out.println("✓ 问题已提交，您的排队号码是：" + questionCounter);
        System.out.println("  当前队列中有 " + questionQueue.size() + " 个问题等待解答");
    }

    /**
     * 解答下一个问题
     */
    public void answerNextQuestion() {
        if (questionQueue.isEmpty()) {
            System.out.println("当前没有待解答的问题");
            return;
        }

        Question question = questionQueue.dequeue();
        System.out.println("\n========== 正在解答问题 ==========");
        System.out.println(question.toString());
        System.out.println("===================================");
    }

    /**
     * 查看当前队列状态
     */
    public void showQueueStatus() {
        if (questionQueue.isEmpty()) {
            System.out.println("当前没有待解答的问题");
            return;
        }

        System.out.println("\n========== 当前问题队列 ==========");
        System.out.println("队列中共有 " + questionQueue.size() + " 个问题等待解答：");

        // 注意：由于队列的特性，我们需要临时出队再入队来显示所有元素
        QueueInterface<Question> tempQueue = new ArrayQueue<>();
        int index = 1;
        while (!questionQueue.isEmpty()) {
            Question q = questionQueue.dequeue();
            System.out.println(index + ". " + q.toString());
            tempQueue.enqueue(q);
            index++;
        }

        // 恢复原队列
        while (!tempQueue.isEmpty()) {
            questionQueue.enqueue(tempQueue.dequeue());
        }
        System.out.println("===================================");
    }

    /**
     * 主程序菜单
     */
    public void run() {
        Scanner scanner = new Scanner(System.in);

        System.out.println("========== 数据结构课程答疑系统 ==========");
        System.out.println("欢迎使用答疑系统！");

        while (true) {
            System.out.println("\n请选择操作：");
            System.out.println("1. 提交问题");
            System.out.println("2. 解答下一个问题");
            System.out.println("3. 查看当前队列状态");
            System.out.println("4. 批量解答所有问题");
            System.out.println("5. 退出系统");
            System.out.print("请输入选项（1-5）: ");

            try {
                int choice = scanner.nextInt();
                scanner.nextLine(); // 清除换行符

                switch (choice) {
                    case 1:
                        System.out.print("请输入学生姓名: ");
                        String name = scanner.nextLine();
                        System.out.print("请输入学号: ");
                        String id = scanner.nextLine();
                        System.out.print("请输入问题内容: ");
                        String question = scanner.nextLine();
                        submitQuestion(name, id, question);
                        break;

                    case 2:
                        answerNextQuestion();
                        System.out.print("\n按回车键继续...");
                        scanner.nextLine();
                        break;

                    case 3:
                        showQueueStatus();
                        break;

                    case 4:
                        batchAnswer();
                        break;

                    case 5:
                        System.out.println("感谢使用答疑系统！再见！");
                        scanner.close();
                        return;

                    default:
                        System.out.println("无效的选项，请重新选择");
                }
            } catch (Exception e) {
                System.out.println("输入错误：" + e.getMessage());
                scanner.nextLine(); // 清除输入缓冲区
            }
        }
    }

    /**
     * 批量解答所有问题
     */
    private void batchAnswer() {
        if (questionQueue.isEmpty()) {
            System.out.println("当前没有待解答的问题");
            return;
        }

        System.out.println("\n========== 批量解答 ==========");
        int count = questionQueue.size();
        int index = 1;
        while (!questionQueue.isEmpty()) {
            System.out.println("\n【第" + index + "个问题 / 共" + count + "个】");
            answerNextQuestion();
            index++;

            // 如果不是最后一个问题，稍作停顿
            if (!questionQueue.isEmpty()) {
                try {
                    Thread.sleep(500); // 暂停500毫秒，模拟解答时间
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        }
        System.out.println("\n✓ 所有问题已解答完毕！");
        System.out.println("============================");
    }

    /**
     * 主方法
     */
    public static void main(String[] args) {
        QASystem system = new QASystem();

        // 可以预设一些问题用于演示
        System.out.println("正在初始化系统...");
        system.submitQuestion("张三", "2021001", "什么是数据结构？");
        system.submitQuestion("李四", "2021002", "栈和队列有什么区别？");
        system.submitQuestion("王五", "2021003", "如何实现一个链表？");
        System.out.println("预设问题已添加。\n");

        // 运行系统
        system.run();
    }
}

